function Music () {
  this.init()
}
(function () {
  var pages = []
  var panels = []
  var selectedItem = null
  Music.prototype = {
    total: 70,
    pageSize: 10,
    dataUrl: 'http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common',
    playerUrl: 'http://box.baidu.com/widget/flash/bdspacesong.swf',

    init: function () {
      var me = this
      domUtils.on($G('J_searchName'), 'keyup', function (event) {
        var e = window.event || event
        if (e.keyCode == 13) {
          me.dosearch()
        }
      })
      domUtils.on($G('J_searchBtn'), 'click', function () {
        me.dosearch()
      })
    },
    callback: function (data) {
      var me = this
      me.data = data.song_list
      setTimeout(function () {
        $G('J_resultBar').innerHTML = me._renderTemplate(data.song_list)
      }, 300)
    },
    dosearch: function () {
      var me = this
      selectedItem = null
      var key = $G('J_searchName').value
      if (utils.trim(key) == '') return false
      key = encodeURIComponent(key)
      me._sent(key)
    },
    doselect: function (i) {
      var me = this
      if (typeof i === 'object') {
        selectedItem = i
      } else if (typeof i === 'number') {
        selectedItem = me.data[i]
      }
    },
    onpageclick: function (id) {
      var me = this
      for (var i = 0; i < pages.length; i++) {
        $G(pages[i]).className = 'pageoff'
        $G(panels[i]).className = 'paneloff'
      }
      $G('page' + id).className = 'pageon'
      $G('panel' + id).className = 'panelon'
    },
    listenTest: function (elem) {
      var me = this
      var view = $G('J_preview')
      var is_play_action = (elem.className == 'm-try')
      var old_trying = me._getTryingElem()

      if (old_trying) {
        old_trying.className = 'm-try'
        view.innerHTML = ''
      }
      if (is_play_action) {
        elem.className = 'm-trying'
        view.innerHTML = me._buildMusicHtml(me._getUrl(true))
      }
    },
    _sent: function (param) {
      var me = this
      $G('J_resultBar').innerHTML = '<div class="loading"></div>'

      utils.loadFile(document, {
        src: me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback&.r=' + Math.random(),
        tag: 'script',
        type: 'text/javascript',
        defer: 'defer'
      })
    },
    _removeHtml: function (str) {
      var reg = /<\s*\/?\s*[^>]*\s*>/gi
      return str.replace(reg, '')
    },
    _getUrl: function (isTryListen) {
      var me = this
      var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist=' +
                encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra=' +
                encodeURIComponent(me._removeHtml(selectedItem.album_title)) +
                '&autoPlay=' + isTryListen + '' + '&loop=true'
      return me.playerUrl + '?' + param
    },
    _getTryingElem: function () {
      var s = $G('J_listPanel').getElementsByTagName('span')

      for (var i = 0; i < s.length; i++) {
        if (s[i].className == 'm-trying') { return s[i] }
      }
      return null
    },
    _buildMusicHtml: function (playerUrl) {
      var html = '<embed class="BDE_try_Music" allowfullscreen="false" pluginspage="http://www.macromedia.com/go/getflashplayer"'
      html += ' src="' + playerUrl + '"'
      html += ' width="1" height="1" style="position:absolute;left:-2000px;"'
      html += ' type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false"'
      html += ' menu="false" allowscriptaccess="never" scale="noborder">'
      return html
    },
    _byteLength: function (str) {
      return str.replace(/[^\u0000-\u007f]/g, '\u0061\u0061').length
    },
    _getMaxText: function (s) {
      var me = this
      s = me._removeHtml(s)
      if (me._byteLength(s) > 12) { return s.substring(0, 5) + '...' }
      if (!s) s = '&nbsp;'
      return s
    },
    _rebuildData: function (data) {
      var me = this
      var newData = []
      var d = me.pageSize
      var itembox
      for (var i = 0; i < data.length; i++) {
        if ((i + d) % d == 0) {
          itembox = []
          newData.push(itembox)
        }
        itembox.push(data[i])
      }
      return newData
    },
    _renderTemplate: function (data) {
      var me = this
      if (data.length == 0) return '<div class="empty">' + lang.emptyTxt + '</div>'
      data = me._rebuildData(data)
      var s = []; var p = []; var t = []
      s.push('<div id="J_listPanel" class="listPanel">')
      p.push('<div class="page">')
      for (var i = 0, tmpList; tmpList = data[i++];) {
        panels.push('panel' + i)
        pages.push('page' + i)
        if (i == 1) {
          s.push('<div id="panel' + i + '" class="panelon">')
          if (data.length != 1) {
            t.push('<div id="page' + i + '" onclick="music.onpageclick(' + i + ')" class="pageon">' + (i) + '</div>')
          }
        } else {
          s.push('<div id="panel' + i + '" class="paneloff">')
          t.push('<div id="page' + i + '" onclick="music.onpageclick(' + i + ')" class="pageoff">' + (i) + '</div>')
        }
        s.push('<div class="m-box">')
        s.push('<div class="m-h"><span class="m-t">' + lang.chapter + '</span><span class="m-s">' + lang.singer +
                    '</span><span class="m-z">' + lang.special + '</span><span class="m-try-t">' + lang.listenTest + '</span></div>')
        for (var j = 0, tmpObj; tmpObj = tmpList[j++];) {
          s.push('<label for="radio-' + i + '-' + j + '" class="m-m">')
          s.push('<input type="radio" id="radio-' + i + '-' + j + '" name="musicId" class="m-l" onclick="music.doselect(' + (me.pageSize * (i - 1) + (j - 1)) + ')"/>')
          s.push('<span class="m-t">' + me._getMaxText(tmpObj.title) + '</span>')
          s.push('<span class="m-s">' + me._getMaxText(tmpObj.author) + '</span>')
          s.push('<span class="m-z">' + me._getMaxText(tmpObj.album_title) + '</span>')
          s.push('<span class="m-try" onclick="music.doselect(' + (me.pageSize * (i - 1) + (j - 1)) + ');music.listenTest(this)"></span>')
          s.push('</label>')
        }
        s.push('</div>')
        s.push('</div>')
      }
      t.reverse()
      p.push(t.join(''))
      s.push('</div>')
      p.push('</div>')
      return s.join('') + p.join('')
    },
    exec: function () {
      var me = this
      if (selectedItem == null) return
      $G('J_preview').innerHTML = ''
      editor.execCommand('music', {
        url: me._getUrl(false),
        width: 400,
        height: 95
      })
    }
  }
})()
